/* 
 * MComboBox.java
 * 类似QQ登录窗的用户输入框
 * 参考网上代码自己修改
 * MComboBoxListCellRender中的update方法不完善
 * 不能及时更新输入框图标
 * 需借助本类setFieldIconShow方法
 * 最后修改时间:2011.7.25
 */
package org.vacoor.ui.qq.combobox;

import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;

/*
 * @Author Vacoor
 */
public class QQComboBox extends JComboBox {

	private static final long serialVersionUID = 1L;
	private final Dimension maxIconDim = new Dimension(40, 40); //Popup中图片大小
    private final Dimension minIconDim = new Dimension(20, 20); //输入框中图片大小
    private boolean isIconShow = true; //是否在输入框处显示头像
    //监听器列表,用于存放自定义的监听器
    private List<ItemListener> itemListeners = new ArrayList<ItemListener>();
    private String noItemText;
    
    public QQComboBox(ComboBoxModel aModel) {
        super(aModel);
        MComboBoxInit();
    }

    public QQComboBox(QQComItem[] items) {
        super(items);
        MComboBoxInit();
    }

//    public MComboBox(Vector<MComboBoxItem> items) {
//        super(items);
//        MComboBoxInit();
//    }
    private void MComboBoxInit() {
        noItemText="请输入账号";
        this.setUI(new QQComboBoxUI(this)); //设置UI
        this.setBorder(BorderFactory.createLineBorder(new Color(167, 195, 212)));  //设置边框颜色
        this.setPreferredSize(new Dimension(180, 26));  //设置缺省大小
    }
    //构造方法结束

    @Override
    public void addItem(Object anObject) {
        //System.out.println("不支持addItem方法");
        javax.swing.JOptionPane.showMessageDialog(this, "Sorry,不支持addItem方法");
    }

    //添加自己的监听器
    public void addMItemListener(ItemListener listener) {
        itemListeners.add(listener);
    }

    public void removeMytemListener(ItemListener listener) {
        itemListeners.remove(listener);
    }

    //以下三个方法用于实现接口中的方法
    protected boolean fireItemDeleting(QQComItem item) {
        boolean del = true;
        for (ItemListener lt : itemListeners) {
            del = lt.itemDeleting(item);
        }
        return del;
    }

    protected void fireItemSelected(QQComItem item) {
        //利用简化的for语句遍历
        for (ItemListener lt : itemListeners) {
            lt.itemSelected(item);
        }
    }

    protected void fireItemDeleted(QQComItem item) {
        for (ItemListener lt : itemListeners) {
            lt.itemDeleted(item);
        }
    }

    //是否在输入框显示图片的get和set方法
    public void setFieldIconShow(boolean isShow) {
        this.isIconShow = isShow;
        ((QQComboBoxEditor) (this.getEditor())).updateIcon(isShow);
        ((QQComboBoxListCellRender) (this.getRenderer())).updateIcon(isShow);
        //不可编辑框中选中内容无法及时更新，只好暂用这个方法
        if (!this.isEditable) {
            this.setSelectedIndex(this.getSelectedIndex() + 1);
            this.setSelectedIndex(this.getSelectedIndex() - 1);
        }
    }

    
    public boolean getFieldIconShow() {
        return this.isIconShow;
    }
    
    //无选项时文本的设置
    public String getNoItemText() {
        return noItemText;
    }
    
    
    public void setNoItemText(String noItemText) {
        this.noItemText = noItemText;
        ((QQComboBoxEditor)this.getEditor()).updateNoItemText(noItemText);
    }
    
    //得到图标大小
    public Dimension getMaxIconDim() {
        return maxIconDim;
    }

    public Dimension getMinIconDim() {
        return minIconDim;
    }
}